﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Tecnopez.Globals;
using BussinessLogicTecnoPez;
using BussinessLogicTecnoPez.AtencionCliente.Pedido;
using BussinessLogicTecnoPez.Tipos_Comunes;
using BussinessLogicTecnoPez.Produccion.Enfermedades_y_control_de_estanques;
using BussinessLogicTecnoPez.Produccion.Producto;
using BussinessLogicTecnoPez.Utils;
using System.Transactions;

public partial class Modules_AtencionCliente_Pedido_RecepcionRemito : System.Web.UI.Page
{
    private DetallePedido objDetallePedido;

    #region ViewState properties
    private enum VIEW_STATE_REMITO
    {
        VIEW_STATE_ID_EMPLEADO,
        VIEW_STATE_ID_MONEDA,
        VIEW_STATE_ID_PEDIDO,
        VIEW_STATE_ID_TRANSPORTISTA
    }

    private Empleado VIEW_STATE_EMPLEADO
    {
        get
        {
            int IdEmpleado = Convert.ToInt32(ViewState[VIEW_STATE_REMITO.VIEW_STATE_ID_EMPLEADO.ToString()]);
            Empleado.getManager.ClearFilters();
            Empleado.getManager.AddFilter("IDEMPLEADO", GenericManager<Empleado>.filterOperator.Equals, IdEmpleado);
            return Empleado.getManager.GetOne();
        }
        set
        {
            ViewState[VIEW_STATE_REMITO.VIEW_STATE_ID_EMPLEADO.ToString()] = value.IdEmpleado.ToString();
        }
    }
    private TipoMoneda VIEW_STATE_MONEDA
    {
        get
        {
            int IdMoneda = Convert.ToInt32(ViewState[VIEW_STATE_REMITO.VIEW_STATE_ID_MONEDA.ToString()]);
            TipoMoneda.getManager.ClearFilters();
            TipoMoneda.getManager.AddFilter("IDTIPOMONEDA", GenericManager<TipoMoneda>.filterOperator.Equals, IdMoneda);
            return TipoMoneda.getManager.GetOne();
        }
        set
        {
            ViewState[VIEW_STATE_REMITO.VIEW_STATE_ID_MONEDA.ToString()] = value.IdTipoMoneda.ToString();
        }
    }
    private Pedido VIEW_STATE_PEDIDO
    {
        get
        {
            int IdPedido = Convert.ToInt32(ViewState[VIEW_STATE_REMITO.VIEW_STATE_ID_PEDIDO.ToString()]);
            Pedido.getManager.ClearFilters();
            Pedido.getManager.AddFilter("IDPEDIDO", GenericManager<Pedido>.filterOperator.Equals, IdPedido);
            return Pedido.getManager.GetOne();
        }
        set
        {
            ViewState[VIEW_STATE_REMITO.VIEW_STATE_ID_PEDIDO.ToString()] = value.IdPedido.ToString();
        }
    }
    private Transportista VIEW_STATE_TRANSPORTISTA
    {
        get
        {
            int IdTransportista = Convert.ToInt32(ViewState[VIEW_STATE_REMITO.VIEW_STATE_ID_TRANSPORTISTA.ToString()]);
            Transportista.getManager.ClearFilters();
            Transportista.getManager.AddFilter("IDTRANSPORTISTA", GenericManager<Transportista>.filterOperator.Equals, IdTransportista);
            return Transportista.getManager.GetOne();
        }
        set
        {
            ViewState[VIEW_STATE_REMITO.VIEW_STATE_ID_TRANSPORTISTA.ToString()] = value.IdTransportista.ToString();
        }
    }
    #endregion

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {
            SetMode(PageMode.ListMode);
        }

        TPPBuscarTransportista.ObjType = typeof(Transportista);

        InicializarGrilla();
        
        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/wordprocessing.png";
        master.Titulo = "Recepción de Remitos";
        _lblError.Text = "";
    }
    private void InicializarGrilla()
    {
        grdRemitos.setupGrid(typeof(Remito), cargarGrilla, true, true, this.ViewState);
    }

    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        switch (mode)
        {
            case PageMode.ListMode:
                mvABM.ActiveViewIndex = 0;
                break;
            case PageMode.NewMode:
                mvABM.ActiveViewIndex = 1;
                chkAnulado.Enabled = false;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdPedido.Enabled = true;
                break;
            case PageMode.EditMode:
                mvABM.ActiveViewIndex = 1;
                chkAnulado.Enabled = false;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdPedido.Enabled = true;
                break;
            case PageMode.ViewMode:
                mvABM.ActiveViewIndex = 1;
                chkAnulado.Enabled = false;
                cmdAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdPedido.Enabled = false;
                break;
        }
    }

    private void cargarGrilla()
    {
        Remito.getManager.ClearFilters();
        Remito.getManager.ClearOrders();
        Remito.getManager.AddFilter("idRemito", GenericManager<Remito>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");
        Remito.getManager.AddFilter("FECHARECEPCION", GenericManager<Remito>.filterOperator.Equals, null);

        if (TPPBuscarTransportista.ItemSelected != null)
        {
            Transportista objTransportista = TPPBuscarTransportista.ItemSelected as Transportista;
            Remito.getManager.AddFilter("TRANSPORTISTA", GenericManager<Remito>.filterOperator.Equals, objTransportista.IdTransportista);
        }

        if (ViewState[grdRemitos.PageDataViewOrderKey] == null)
        {
            Remito.getManager.AddOrder("idRemito", GenericManager<Remito>.Order.orderDirection.DESC);
        }
        else
        {
            Remito.getManager.AddOrder(ViewState[grdRemitos.PageDataViewOrderKey].ToString(), (GenericManager<Remito>.Order.orderDirection)ViewState[grdRemitos.PageDataViewOrdenDireccionKey]);
        }

        List<Remito> lista = new List<Remito>();
        lista = Remito.getManager.GetFilter();
        grdRemitos.DataSource = lista;
        grdRemitos.DataBind();

    }
    protected void cmdPedido_Click(object sender, EventArgs e)
    {
        mvABM.ActiveViewIndex = 2;
        Pedido objPedido = this.VIEW_STATE_PEDIDO;

        this.lblIdPedido.Text = objPedido.IdPedido.ToString();
        this.lblEstadoPedido.Text = objPedido.TipoEstadoPedido.ToString();
        this.lblEmpleadoPedido.Text = objPedido.Empleado.ToString();
        this.lblFechaEmisionPedido.Text = objPedido.FechaEmision.ToShortDateString();
        this.lblFechaEntregaPedido.Text = objPedido.FechaEntrega.ToShortDateString();
        this.lblPrioridadPedido.Text = System.Enum.Parse(typeof(AppEnums.PedidoPrioridad), objPedido.Prioridad.ToString(), true).ToString();
        this.lblTipoEntregaPedido.Text = System.Enum.Parse(typeof(AppEnums.PedidoTipoEntrega), objPedido.TipoEntrega.ToString(), true).ToString();
        this.lblMonedaPedido.Text = objPedido.TipoMoneda.ToString();
        this.lblMontoPedido.Text = objPedido.Monto.ToString();
        this.objDetallePedido = objPedido.DetallePedido;

        grdDetallePedido.setupGrid(typeof(DetallePedidoView), cargarGrillaDetallePedido, true, false, this.ViewState, new DataControlField[0]);
    }
    private void cargarGrillaDetallePedido()
    {
        if (objDetallePedido != null)
        {
            List<DetallePedidoViewRemito> objList = new List<DetallePedidoViewRemito>();
            foreach (ItemDetallePedido objItem in objDetallePedido.ItemList)
            {
                objList.Add(new DetallePedidoViewRemito(objItem));
            }
            grdDetallePedido.DataSource = objList;
        }
        else
        {
            grdDetallePedido.DataSource = null;
        }
        grdDetallePedido.DataBind();
    }
    protected void cmdVolver_Click(object sender, EventArgs e)
    {
        mvABM.ActiveViewIndex = 1;
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            Remito.getManager.ClearFilters();
            Remito.getManager.AddFilter("IDREMITO", GenericManager<Remito>.filterOperator.Equals, Convert.ToInt32(txtId.Text));
            Remito objRemito = Remito.getManager.GetOne();

            if (objRemito == null)
            {
                _lblError.Text = "Error inesperado.";
                return;
            }

            DateTime aux;
            if (!DateTime.TryParse(TPCFechaRecepcion.Text, out aux))
            {
                _lblError.Text = "Fecha de recepción no posee el formato correcto";
                return;
            }
            else
                objRemito.FechaRecepcion = aux;

            if (objRemito.FechaEnvio > objRemito.FechaRecepcion)
            {
                _lblError.Text = "La fecha de envío no puede ser superior a la fecha de recepción";
                return;
            }

            using (TransactionScope objScope = new TransactionScope())
            {
                if (!Remito.getManager.Update(objRemito))
                    throw Remito.getManager.GeneratedException;

                TipoEstadoPedido.getManager.ClearFilters();
                TipoEstadoPedido.getManager.AddFilter("IDTIPOESTADOPEDIDO", GenericManager<TipoEstadoPedido>.filterOperator.Equals, Convert.ToInt32(TipoEstadoPedido.TiposEstadosPedidos.Entregado));
                objRemito.Pedido.TipoEstadoPedido = TipoEstadoPedido.getManager.GetOne();

                if (!Pedido.getManager.Update(objRemito.Pedido))
                    throw Pedido.getManager.GeneratedException;

                SetMode(PageMode.ListMode);
                cargarGrilla();
                objScope.Complete();
            }
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }
    protected void grdRemitos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdRemitos.Rows[0].Cells[0].Text == "&nbsp;")
        {
            return;
        }
        /*
         * si el remito tiene fecha recepcion, no se puede editar ni anular
         * si ya esta anulado no se puede recibir
         */
        if (e.CommandName == "ver")
        {
            int IdRemito = int.Parse(grdRemitos.DataKeys[System.Convert.ToInt32(e.CommandArgument)].Value.ToString());
            Remito.getManager.ClearFilters();
            Remito.getManager.AddFilter("IDRemito", GenericManager<Remito>.filterOperator.Equals, IdRemito);
            Remito objRemito = Remito.getManager.GetOne();

            txtId.Text = objRemito.IdRemito.ToString();
            chkAnulado.Checked = objRemito.Anulado;
            lblDestinoData.Text = objRemito.Destino;
            lblEmpleado.Text = objRemito.Empleado.ToString();
            this.VIEW_STATE_EMPLEADO = objRemito.Empleado;
            lblFechaEnvioData.Text = objRemito.FechaEnvio.ToShortDateString();
            TPCFechaRecepcion.Text = DateTime.Today.ToShortDateString();
            lblObservacionesData.Text = objRemito.Observaciones;
            this.VIEW_STATE_PEDIDO = objRemito.Pedido;
            this.VIEW_STATE_TRANSPORTISTA = objRemito.Transportista;

            SetMode(PageMode.EditMode);
        }
    }
}
/// <summary>
/// Utilizada para manejar la grilla de detalle de pedido
/// </summary>
internal class DetallePedidoViewRemito
{
    private Producto objProducto;
    private decimal cantidad;
    private decimal precio;

    public DetallePedidoViewRemito()
    {
        this.objProducto = null;
        this.cantidad = 0;
        this.precio = 0;
    }

    public DetallePedidoViewRemito(Producto objProducto, decimal cantidad, decimal precio)
    {
        this.objProducto = objProducto;
        this.cantidad = cantidad;
        this.precio = precio;
    }

    public DetallePedidoViewRemito(ItemDetallePedido objItem)
    {
        this.objProducto = objItem.Producto;
        this.cantidad = objItem.Cantidad;
        this.precio = objItem.Precio;
    }

    [FriendlyName("Producto", true)]
    [DBField("IDPRODUCTO", true, false, true, "IDPRODUCTO")]
    public Producto Producto
    {
        get { return objProducto; }
        set { objProducto = value; }
    }

    [FriendlyName("Cantidad", true)]
    [DBField("CANTIDAD", false, false)]
    public decimal Cantidad
    {
        get { return cantidad; }
        set { cantidad = value; }
    }

    [FriendlyName("Precio", true)]
    [DBField("PRECIO", false, false)]
    public decimal Precio
    {
        get { return precio; }
        set { precio = value; }
    }
}